#include <stdio.h>//冒泡排序传值传址模拟qsort函数
#include <string.h>
void print(int arr[],int sz)
{
    for(int i=0;i<sz;i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
}
int cmp_int(const void* p1,const void* p2)
{
    return *(int*)p1-*(int*)p2;
}
void swap(char* p1,char* p2,int width)
{
    for(int i=0;i<width;i++)
    {
        char tmp=*p1;
        *p1=*p2;
        *p2=tmp;
        p1++;
        p2++;
    }

}
void my_qsort(void* arr,int sz,int width,int (*cmp)(const void* p1,const void*p2))
{
    for(int i=0;i<sz-1;i++)
    {
        for(int j=0;j<sz-i-1;j++)
        {
            if(cmp((char*)arr+j*width,(char*)arr+(j+1)*width)>0)
            {
                swap((char*)arr+j*width,(char*)arr+(j+1)*width,width);
            }
        }
    }
}
struct Stu
{
    char name[20];
    int age;
};
int cmp_Stu_by_age(const void* p1,const void* p2)
{
    //return (*(struct Stu*)p1).age-(*(struct Stu*)p2).age;
    return ((struct Stu*)p1)->age-((struct Stu*)p2)->age;
}
int cmp_Stu_by_name(const void* p1,const void* p2)
{
    return strcmp(((struct Stu*)p1)->name,((struct Stu*)p2)->name);
}
int main()
{
    struct Stu s[3]={{"zhangsan",20},{"lisi",18},{"wangwu",19}};
    int sz2=sizeof(s)/sizeof(s[0]);
    for(int i=0;i<sz2;i++)
    {
        printf("%s %d\n",s[i].name,s[i].age);
    }
    my_qsort(s,sz2,sizeof(s[0]),cmp_Stu_by_age);
    for(int i=0;i<sz2;i++)
    {
        printf("%s %d\n",s[i].name,s[i].age);
    }
    my_qsort(s,sz2,sizeof(s[0]),cmp_Stu_by_name);
    for(int i=0;i<sz2;i++)
    {
        printf("%s %d\n",s[i].name,s[i].age);
    }
    int arr[10]={6,4,2,8,0,7,9,1,5,3};
    int sz=sizeof(arr)/sizeof(arr[0]);
    print(arr,sz);
    my_qsort(arr,sz,sizeof(arr[0]),cmp_int);
    print(arr,sz);
    return 0;
}